priv->widget = NULL;
}
+static gboolean
+same_native (GtkWidget *widget,
+ GtkWidget *target)
+{
+ GtkWidget *native;
+ GtkWidget *native2;
+
+ if (!widget || !target)
+ return TRUE;
+
+ native = GTK_WIDGET (gtk_widget_get_native (widget));
+ native2 = GTK_WIDGET (gtk_widget_get_native (widget));
+
+ return native == native2;
+}
+
static gboolean
gtk_event_controller_filter_event_default (GtkEventController *self,
const GdkEvent *event)
if (priv->limit == GTK_LIMIT_SAME_NATIVE)
{
- GtkWidget *native;
- GtkWidget *native2;
- GtkWidget *target;
+ if (same_native (priv->widget, GTK_WIDGET (gdk_event_get_target (event))) &&
+ same_native (priv->widget, GTK_WIDGET (gdk_event_get_related_target (event))))
+ return FALSE;
+
+ return TRUE;
+ }
- native = GTK_WIDGET (gtk_widget_get_native (priv->widget));
+ return FALSE;
+}
- target = GTK_WIDGET (gdk_event_get_target (event));
- if (target)
- {
- native2 = GTK_WIDGET (gtk_widget_get_native (target));
- if (native == native2)
- return FALSE;
- }
+static gboolean
+gtk_event_controller_filter_crossing_default (GtkEventController *self,
+ const GtkCrossingData *crossing)
+{
+ GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (self);
- target = GTK_WIDGET (gdk_event_get_related_target (event));
+ if (priv->widget && !gtk_widget_is_sensitive (priv->widget))
+ return TRUE;
- if (target)
- {
- native2 = GTK_WIDGET (gtk_widget_get_native (target));
- if (native == native2)
- return FALSE;
- }
+ if (priv->limit == GTK_LIMIT_SAME_NATIVE)
+ {
+ if (same_native (priv->widget, crossing->old_target) &&
+ same_native (priv->widget, crossing->new_target))
+ return FALSE;
return TRUE;
}
klass->set_widget = gtk_event_controller_set_widget;
klass->unset_widget = gtk_event_controller_unset_widget;
klass->filter_event = gtk_event_controller_filter_event_default;
+ klass->filter_crossing = gtk_event_controller_filter_crossing_default;
klass->handle_event = gtk_event_controller_handle_event_default;
klass->handle_crossing = gtk_event_controller_handle_crossing_default;
controller_class = GTK_EVENT_CONTROLLER_GET_CLASS (controller);
+ if (controller_class->filter_crossing (controller, crossing))
+ return;
+
g_object_ref (controller);
controller_class->handle_crossing (controller, crossing, x, y);
g_object_unref (controller);